/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.pecinovsky.english.pojj.adv_framework.test_util.default_gui;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IListener;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IPlaceG;

import java.awt.Point;
import java.awt.Rectangle;

import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;



/*******************************************************************************
 * Instance třídy {@code PlánekHry} přestavují aplikační okno
 * zobrazující plánek hry a na něm kurzor představující hráče.
 * Z pozice kurzoru je možno odvodit pozici hráče.
 *
 * @author    Rudolf PECINOVSKÝ
 * @version   0.00.000
 */
public class PlánekHry implements IListener<IPlaceG>
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    private static final String TITULEK_PLÁNKU = "Plánek hry";

    private static final URL URL_HRACE = 
                             PlánekHry.class.getResource("Hráč.png");



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** GUI, pro které pracuji. */
    private final IMojeGUI gui;

    /** Aplikační okno zobrazující plánek hry. */
    private final JFrame  frmPlánek;

    /** Návěští s obrázkem plánku hry. */
    private final JLabel  lblPlánek;

    /** Návěští s obrázkem kurzoru představujícího hráče. */
    private final JLabel  lblHráč;

    /** Obrázek kurzoru představujícího hráče. */
    private final ImageIcon imiHráč;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Obrázek s plánkem hry. */
    private ImageIcon imiPlánek;

    /** Aktuálně ovládaná hra. */
    private IGameG hra;



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří aplikační okno s plánkem hry a kurzorem hráče,
     * který se po tomto plánku ponybuje.
     *
     * @param gui GUI, pro něž bude aplikační okno pracovat
     */
    public PlánekHry(IMojeGUI gui)
    {
        this.gui  = gui;

        frmPlánek = new JFrame(TITULEK_PLÁNKU);
        frmPlánek.setLayout(null);
        lblPlánek = new JLabel();

        imiHráč  = new ImageIcon(URL_HRACE);
        lblHráč  = new JLabel(imiHráč);
        lblHráč.setBounds(0, 0,
                          imiHráč.getIconWidth(), imiHráč.getIconHeight());

        //Později přidaná návěští se umísťují pod návěští přidaná dříve
        frmPlánek.add(lblHráč);
        frmPlánek.add(lblPlánek);
    }


//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Nastaví viditelnost okna s plánkem hry.
     *
     * @param visible Má-li být plánek viditelný ({@code true} + má být)
     */
    public void setVisible(boolean visible)
    {
        frmPlánek.setVisible(visible);
    }


//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Hlášení o změně aktuální místnosti
     *
     * @param novaMistnost Nová aktuální místnost
     */
    @Override
    public void notice(IPlaceG novaMistnost)
    {
        umístiHráče();
    }


    /***************************************************************************
     * Inicializuje komunikaci se zadanou hrou.
     *
     * @param hra  Hra, s níž bude GUI komunikovat
     */
    void inicializuj(IGameG hra)
    {
        this.hra = hra;

        //Nastaví obrázek s plánkem
        imiPlánek = hra.getMap();
        lblPlánek.setIcon(imiPlánek);

        int w = imiPlánek.getIconWidth();
        int h = imiPlánek.getIconHeight();
        lblPlánek.setBounds(4, 4, w, h);
        frmPlánek.setSize(w + 16, h + 36);

        //Nastavení pozice plánku pod aplikačním oknem
        Rectangle rctGUI = gui.getOblast();
        frmPlánek.setLocation(rctGUI.x,  rctGUI.y + rctGUI.height);

        hra.addNeighborsListener(this);

        umístiHráče();
        boolean zobrazit = gui.getZobrazovatPlánek();
        setVisible(zobrazit);
    }


    /***************************************************************************
     *
     */
    final void umístiHráče()
    {
        Point poziceHráče = hra.getActualPlace().getPosition();
        lblHráč.setLocation(poziceHráče);
        frmPlánek.setVisible(true);
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        DialogSPlankem inst = new DialogSPlankem();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
